package com.tedu.api.list;

import org.junit.Test;

import java.util.*;

/**
 * Collection[接口]顶级集合容器
 * List集合【接口】继承与Collection【接口】
 * List集合：存储重复并且有序的元素
 * 注意List集合类似数组，有些方法与数组使用一致
 * List集合【接口】
 * java.util.ArrayList数组实现【常用】
 * java.util.LinkedList：链表实现
 * 以上两个类使用方法完全一致！
 */
public class ListAPI {
    /**List接口--提供get方法，可以被ArrayList类重写
     * get(int index)  返回值：E
     * 作用：根据下标获取集合元素
     */
    @Test
    public void testGet(){
        ///多态方式 父类引用指向子类对象【常用：调父，子方法，方法相同，重写】
        //List<String> list=new ArrayList<>();
        //list.get(0); //重写：调用子类的get方法
        //直接创建实现类对象：调用ArrayList方法
        //ArrayList<String> al=new ArrayList<>();
        //al.get(0);
        List<String> list=new ArrayList<>();
        list.add("西游记");list.add("水浒传");list.add("红楼梦");
        System.out.println("打印list集合"+list);
        //获取下标:1
        String index=list.get(1);
        System.out.println("取出集合元素"+index);
        //遍历集合内容---普通for
        for(int i=0;i<list.size();i++){//i 下标
            index=list.get(i);
            System.out.println("获取集合全部元素 "+index);
        }
    }

    /**List接口下方法
     * 添加 替换 移除
     * add(int index,E e)方法
     * 作用将给定元素插入到指定位置
     * set(int index,E e)方法                    返回值E
     * 作用：将给定元素设置到指定的位置上【替换】
     * remove(int index)方法                   返回值E
     *Collection接口 remove使用方法一致 用元素删除
     * List接口remove方法，用下标删除
     * -------------------总结：以上三个方法都可以直接操作集合
     */
    @Test
    public void testASR(){
     List<String> list=new ArrayList<>();
     list.add("one");list.add("two");list.add("three");
     //需求：在集合 two元素前 添加"2"
        list.add(1,"2");
        System.out.println("插入元素的集合"+list);
        //需求：在集合2元素 将2元素替换成二
    }
////////////////////////////////////////////////////////////////////////
    /**每周串讲 List 提供可以获取子集方法     返回值：E[Object对象]
     * subList(int start,int end) 口诀：含头不含尾
     *作用：截取集合中范围内的子集
     */
    @Test
    public void testSubList(){
        //创建集合，指定类型Integer
        List<Integer> list=new ArrayList<>();
        //需求添加十个元素,元素数：0~9数值
        for(int i=0;i<10;i++){
            list.add(i);//add()添加--重写：Collection-add的方法
        }
        //打印集合：
        System.out.println("增加元素后的集合"+list);
        //需求：需要获取子集，范围：3~8的元素
        List<Integer> list1=list.subList(3,9);
        //打印子集合
        System.out.println("获取子集"+list1);
        System.out.println("打印集合"+list);
        //练习1：截取list 2~7的元素，子集扩大10倍提醒set方法
        List<Integer> list2=list.subList(2,8);
        for (int i=0;i<list2.size();i++){ //获取子集下标
            //设置子集扩大十倍
           list2.set(i,list2.get(i)*10);
           //set(i: 0~4 下标
            //    list2.get(0~4)  获取对应元素*10)
        }
        System.out.println("输出list2子集集合元素"+list2);
        //练习2；删除list集合元素中：1~7的元素
        List<Integer> listRem=list.subList(1,8);
        listRem.clear();
        System.out.println("删除list2~7元素，最终集合 "+list);
    }
/**
 * 数组转集合操作
 * Arrays工具类：提供静态方法asList(数组引用)
 *              asList(数组引用)：将数组转换为集合
 * 注意:
 *
 */
@Test
    public void testArrays(){
    //创建字符串静态数组
    String[] array={"十一","元旦","寒假"};
    //将数组转换为集合    ---软件更新
    List<String> list=Arrays.asList(array);
    //需求：将list集合中“元旦”改成“除夕”
    list.set(1,"除夕"); //set方法是list接口 方法
    System.out.println("数组转集合："+list);
    //需求：增强for，数组添加元素【add方法 add(”“)】
    for (String str:array){
        /**
         * UnsupportedOperationException
         * 不支持操作系统异常
         * 因为遍历数组，进行集合操作，不支持操作异常
         */
        //list.add("节日");
    }
    /**
     * List构造器使用:传入有参构造器【类型：其他集合，功能：addAll】
     * 创建集合 List<String> list=new ArrayList(集合引用);
     */
    List<String> lists=new ArrayList<>();
    //集合构造器参数：集合引用---lists集合元素添加至lists集合中
    //替代：addAll方法    操作：并集
    List<String> lists1=new ArrayList<>();
}
/**
 * 集合排序
 * Collections 工具类
 *静态方法：sort() 排序 实现list接口排序功能
 *
 *
 * java.util.Random：伪随机数
 * 导入包问题：通过导入包方式
 *          如果类存在于util工具包下，例如：import java.util.*
 *          类最上方： import java.util.Random
 *                   import java.util.List
 *                   import java.util.ArrayList
 *    需求创建集合随机生成十个元素【100以内随机】
 */
@Test
        public void testRandom(){
    List<Integer> list=new ArrayList<>();
    //创建随机数对象
    Random random=new Random();
    //给list集合添加十个元素【100以内随机】
    for (int i=0;i<10;i++){
        list.add(random.nextInt(100));//100以内随机数
    }
    System.out.println("List集合"+list);
    //将list集合元素进行排序
    Collections.sort(list);
    System.out.println("排序后list集合"+list);
    }

    /**
     * 集合排序
     * Collections 工具类
     *
     * 面试题：Collection和Collections的区别
     *        Collection所有集合顶级接口，约定所有集合共有方法
     *        Collections工具类，提供集合操作方法！
     *
     * 静态方法sort(集合引用，比较器引用)功能：按照比较器约定顺序排序
     * Comparator 比较器
     * 需求：集合存汉字--按照要求排序【比较器】
     */
@Test
    public void testSort(){
    List<String> list=new ArrayList<>();
    list.add("阿西吧");
    list.add("搜嘎寺内");
    list.add("有戏");
    Collections.sort(list);  //排序：针对数值
    System.out.println("排序后集合"+list);
    //需求按照文字长短进行排序 重载sort方法
    //创建比较器接口对象【匿名内部类】 约定一次排序效果
    Comparator<String> com=new Comparator<String>() {
        //定义比较器规则:按照汉字长度排序--交换操作compare方法完成操作
        public int compare(String o1, String o2) {
            return o1.length()-o2.length();
            /**
             * o1.length() 获取第一个字符串长度
             * o2.length() 获取第二个字符串长度
             * 汉字短移动靠前
             * 返回值：大于0    假设4-2      交换
             *        小于0    假设3-4      不变
             *        等于0    假设2-2      交换
             */

        }
    };
    //比较器：规定文字短在前规则，使用比较器规则
    Collections.sort(list,com);
    System.out.println("按照文字长短排序之后s"+list);
}
/**
 *
 * List子接口 无法实例化---实现类：ArrayList LinkedList vector
 * 使用情况：保存一组数据 有序情况，采用List集合
 * List子接口
 *
 */
@Test
    public void testArrayList(){
    //下述方式创建对象：
    //常用方式：父子集对象的方法 多态 方法一致
    //调用父类方法--执行父类功能
    //调用子类方法--与父类方法名参数完全一致，执行子类的重写方法
    List<String> list=new ArrayList<>();
    list.add("张三");list.add("李四");list.add("王五");

    /*//调取几个方法
    list.add("张三"); list.set(0,"王五");
    //下述方式创建对象：只调用ArrayList的方法
    ArrayLi          st<String> arrayList=new ArrayList<>();
    arrayList.add("李四"); arrayList.set(0,"赵六");*/

}









}














